home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / vmstat / RCS / vmstat.c,v < prev    next >
Encoding:
Text File  |  1990-07-03  |  21.7 KB  |  794 lines

  1. head     1.8;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.8
  10. date     90.07.03.16.26.25;  author mendel;  state Exp;
  11. branches ;
  12. next     1.7;
  13.  
  14. 1.7
  15. date     90.05.24.08.34.43;  author ouster;  state Exp;
  16. branches ;
  17. next     1.6;
  18.  
  19. 1.6
  20. date     89.07.31.18.51.27;  author mendel;  state Exp;
  21. branches ;
  22. next     1.5;
  23.  
  24. 1.5
  25. date     89.02.22.11.37.49;  author jhh;  state Exp;
  26. branches ;
  27. next     1.4;
  28.  
  29. 1.4
  30. date     88.09.26.12.00.17;  author nelson;  state Exp;
  31. branches ;
  32. next     1.3;
  33.  
  34. 1.3
  35. date     88.08.15.15.53.19;  author nelson;  state Exp;
  36. branches ;
  37. next     1.2;
  38.  
  39. 1.2
  40. date     88.08.12.19.22.25;  author nelson;  state Exp;
  41. branches ;
  42. next     1.1;
  43.  
  44. 1.1
  45. date     88.08.12.19.19.52;  author nelson;  state Exp;
  46. branches ;
  47. next     ;
  48.  
  49.  
  50. desc
  51. @@
  52.  
  53.  
  54. 1.8
  55. log
  56. @Added decStation 3100 based stats.
  57. @
  58. text
  59. @/* 
  60.  * vmstat.c --
  61.  *
  62.  *    Statistics generation for the virtual memory module.
  63.  *
  64.  * Copyright (C) 1986 Regents of the University of California
  65.  * All rights reserved.
  66.  */
  67.  
  68. #ifndef lint
  69. static char rcsid[] = "$Header: /sprite/src/cmds/vmstat/RCS/vmstat.c,v 1.7 90/05/24 08:34:43 ouster Exp $ SPRITE (Berkeley)";
  70. #endif not lint
  71.  
  72. #include <vm.h>
  73. #include <vmStat.h>
  74. #include <kernel/vm.h>
  75. #include "/sprite/src/kernel/vm/vmInt.h"
  76. #include <option.h>
  77. #include <sys/time.h>
  78. #include <stdio.h>
  79.  
  80. /*
  81.  * Flags to command-line options:
  82.  */
  83. int    checkTime = -1;            /* If != -1 indicates how often to
  84.                      * print a line of stats.  0 means 
  85.                      * just print one line and quit, 
  86.                      * non-zero means print a line
  87.                      * every checkTime seconds. */
  88. int    printSegInfo = 0;        /* Non-zero means print info for
  89.                      * all segments. */
  90. int    whenToPrintHdr = 25;        /* Number of lines of stats after 
  91.                      * which to print the header. */
  92. int    faultThreshold = 0;        /* Number of page faults after which
  93.                      * to print line of stats. */
  94. int    pageOutThreshold = 0;        /* Number of page outs after which
  95.                      * to print line of stats. */
  96. int    relToLastPrint = 0;        /* Non-zero means print stats relative
  97.                      * to last time printed, not last
  98.                      * interval of lengh checkTime. */
  99. int    printMod = 0;            /* Non-zero means replace printing out
  100.                      * of kernel stack pages with number
  101.                      * of modified pages in memory. */
  102. int    maxTimes = -1;            /* Maximum number can skip printing
  103.                      * a line of info because of 
  104.                      * faultThreshold or pageOutThreshold.*/
  105. int    verbose = 0;            /* Print extra more obscure vm 
  106.                      * stats. */
  107.  
  108. Option optionArray[] = {
  109.     {OPT_TRUE, "s", (Address)&printSegInfo,
  110.     "Print out information about all in-use segments"},
  111.     {OPT_TRUE, "v", (Address)&verbose,
  112.     "Print out extra, more obscure vm statistics"},
  113.     {OPT_INT, "t", (Address)&checkTime,
  114.     "Print out incremental vm info at this interval"},
  115.     {OPT_INT, "T", (Address)&maxTimes,
  116.     "Maximum times skip printing because of -f or -p flags. Used with -t."},
  117.     {OPT_INT, "l", (Address)&whenToPrintHdr,
  118.       "Lines to print before should print header (default: 25). Used with -t."},
  119.     {OPT_INT, "f", (Address)&faultThreshold, 
  120.    "Page faults per second before print out info (default: 0).  Used with -t."},
  121.     {OPT_INT, "p", (Address) &pageOutThreshold,
  122.     "Page outs per second before print out info (default: 0).  Used with -t."},
  123.     {OPT_TRUE, "P", (Address)&relToLastPrint,
  124.  "Print out all info since last print, not since last interval. Used with -t."},
  125.     {OPT_TRUE, "m", (Address)&printMod,
  126.     "Print out number of modified pages, not kern stack pages.  Used with -t."},
  127. };
  128. int    numOptions = Opt_Number(optionArray);
  129.  
  130. #define    NUM_SEGMENTS    256
  131. Vm_Stat     vmStat;
  132.  
  133. int    kbPerPage;
  134.  
  135. /*
  136.  *----------------------------------------------------------------------
  137.  *
  138.  * main --
  139.  *
  140.  *    The main program for vmstat.
  141.  *
  142.  * Results:
  143.  *    None.
  144.  *
  145.  * Side effects:
  146.  *    Prints information on standard output.
  147.  *
  148.  *----------------------------------------------------------------------
  149.  */
  150. main(argc, argv)
  151.     int argc;
  152.     char *argv[];
  153. {
  154.     int        pageSize;
  155.  
  156.     (void)Opt_Parse(argc, argv, optionArray, numOptions, 0);
  157.     Vm_PageSize(&pageSize);
  158.     kbPerPage = pageSize / 1024;
  159.  
  160.     if (printSegInfo) {
  161.     PrintSegInfo();
  162.     } else if (checkTime == 0) {
  163.     PrintWide();
  164.     printf("\n");
  165.     } else if (checkTime == -1) {
  166.     PrintSummary();
  167.     } else {
  168.     while (1) {
  169.         PrintWide();
  170.         sleep(checkTime);
  171.     }
  172.     }
  173.     exit(0);
  174. }
  175.  
  176.  
  177. /*
  178.  *----------------------------------------------------------------------
  179.  *
  180.  * PrintSegInfo --
  181.  *
  182.  *    Print vm info about all segments.
  183.  *
  184.  * Results:
  185.  *    None.
  186.  *
  187.  * Side effects:
  188.  *    Prints information on standard output.
  189.  *
  190.  *----------------------------------------------------------------------
  191.  */
  192. PrintSegInfo()
  193. {
  194.     int            actCodePages = 0;
  195.     int            inactCodePages = 0;
  196.     int            actCodeSegs = 0;
  197.     int            inactCodeSegs = 0;
  198.     int            heapPages = 0;
  199.     int            heapSegs = 0;
  200.     int            stackPages = 0;
  201.     int            stackSegs = 0;
  202.     Vm_SegmentInfo    seg;
  203.     int            i;
  204.     char        *typePtr;
  205.     char        *fileNamePtr;
  206.     ReturnStatus    status;
  207.  
  208.     printf("%-10s%-10s%-10s%-10s%-10s%s\n\n", "SEG-NUM", "TYPE",
  209.         "  SIZE", "RES-SIZE", "NUM-REFS", "OBJECT-FILE-NAME");
  210.     for (i = 1; i < NUM_SEGMENTS; i++) {
  211.     fileNamePtr = " ";
  212.     status = Vm_GetSegInfo(NULL, i, sizeof(Vm_SegmentInfo), &seg);
  213.     if (status != SUCCESS) {
  214.         (void) fprintf(stderr,
  215.                "Couldn't read segment info for segment %d: %s\n",
  216.                i,  Stat_GetMsg(status));
  217.         return;
  218.     }
  219.     if (seg.flags & VM_SEG_FREE) {
  220.         continue;
  221.     }
  222.     switch (seg.type) {
  223.         case VM_CODE:
  224.             if (seg.flags & VM_SEG_INACTIVE) {
  225.             typePtr = "Inactive";
  226.             inactCodePages += seg.resPages;
  227.             inactCodeSegs++;
  228.         } else {
  229.             typePtr = "Code";
  230.             actCodePages += seg.resPages;
  231.             actCodeSegs++;
  232.         }
  233.         fileNamePtr = seg.objFileName;
  234.         seg.objFileName[VM_OBJ_FILE_NAME_LENGTH - 1] = '\0';
  235.         break;
  236.         case VM_HEAP:
  237.         typePtr = "Heap";
  238.         heapPages += seg.resPages;
  239.         heapSegs++;
  240.         break;
  241.         case VM_STACK:
  242.         typePtr = "Stack";
  243.         stackPages += seg.resPages;
  244.         stackSegs++;
  245.         break;
  246.     }
  247.     printf("%-10d%-10s   %-7d   %-7d   %-7d%s\n",
  248.                i, typePtr,seg.numPages * kbPerPage,
  249.                seg.resPages * kbPerPage, seg.refCount, fileNamePtr);
  250.     }
  251.     printf("\n%-20s%-15s%-15s\n\n", "TYPE", "NUM-SEGS", "RES-SIZE");
  252.     printf("%-20s%-15d%-15d\n", "Active-code", actCodeSegs, actCodePages);
  253.     printf("%-20s%-15d%-15d\n", "Inactive-code", inactCodeSegs,
  254.          inactCodePages);
  255.     printf("%-20s%-15d%-15d\n", "Heap", heapSegs, heapPages);
  256.     printf("%-20s%-15d%-15d\n", "Stack", stackSegs, stackPages);
  257.     printf("%-20s%-15d%-15d\n", "TOTAL", 
  258.          actCodeSegs + inactCodeSegs + heapSegs + stackSegs,
  259.      (actCodePages + inactCodePages + heapPages + stackPages) * kbPerPage);
  260. }
  261.  
  262. static Vm_Stat    prevStat;
  263.  
  264.  
  265. /*
  266.  *----------------------------------------------------------------------
  267.  *
  268.  * PrintWide --
  269.  *
  270.  *    Print a one summary of vm stats.
  271.  *
  272.  * Results:
  273.  *    None.
  274.  *
  275.  * Side effects:
  276.  *    Prints information on standard output.
  277.  *
  278.  *----------------------------------------------------------------------
  279.  */
  280. PrintWide()
  281. {
  282.     static    int    numLines = 0;
  283.     static    int    numCalls = 0;
  284.     Vm_Stat        vmStat;
  285.  
  286.     (void)Vm_Cmd(VM_GET_STATS, &vmStat);
  287.  
  288.     if (checkTime != 0 && numCalls != maxTimes) {
  289.     if ((vmStat.totalFaults - prevStat.totalFaults) / checkTime < 
  290.         faultThreshold &&
  291.         (vmStat.pagesWritten - prevStat.pagesWritten) / checkTime < 
  292.             pageOutThreshold) {
  293.         if (relToLastPrint) {
  294.         bcopy((Address)&vmStat, (Address)&prevStat, sizeof(Vm_Stat));
  295.         }
  296.         numCalls++;
  297.         return;
  298.     }
  299.     }
  300.     numCalls = 0;
  301.     if (numLines % whenToPrintHdr == 0) {
  302.     if (numLines > 0) {
  303.         printf("\n");
  304.     }
  305.     if (printMod) {
  306.     printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s",
  307.         " AVAIL", "  FREE", "  USER", " MOD%", " KMEM",
  308.         "  FS$", "PF-NUM",
  309.         "PF-SWP", " PF-FS", " POUTS");
  310.     } else {
  311.         printf("%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s%-8s",
  312.         " AVAIL", "  FREE", "  USER",  " KMEM",
  313.         " KSTK", "  FS$", "PF-NUM",
  314.         "PF-SWP", " PF-FS", " POUTS");
  315.     }
  316.     }
  317.     numLines++;
  318.  
  319.     if (printMod) {
  320.     int    numModifiedPages;
  321.  
  322.     (void)Vm_Cmd(VM_COUNT_DIRTY_PAGES, &numModifiedPages);
  323.     printf("\n%6d%8d%8d%8.2f%7d%8d%9d%8d%8d%8d",
  324.          vmStat.numPhysPages * kbPerPage,
  325.          vmStat.numFreePages * kbPerPage, 
  326.          (vmStat.numDirtyPages + vmStat.numUserPages) * kbPerPage,
  327.          (float)numModifiedPages /
  328.            (float)(vmStat.numDirtyPages + vmStat.numUserPages) * 100.0,
  329.          (vmStat.kernMemPages + vmStat.kernStackPages) * kbPerPage, 
  330.          (vmStat.fsMap - vmStat.fsUnmap) * kbPerPage,
  331.          vmStat.totalFaults - prevStat.totalFaults, 
  332.          vmStat.psFilled - prevStat.psFilled,
  333.          vmStat.fsFilled - prevStat.fsFilled,
  334.          vmStat.pagesWritten - prevStat.pagesWritten);
  335.     } else {
  336.     printf("\n%6d%8d%8d%7d%8d%8d%9d%8d%8d%8d",
  337.          vmStat.numPhysPages * kbPerPage,
  338.          vmStat.numFreePages * kbPerPage, 
  339.          (vmStat.numDirtyPages + vmStat.numUserPages) * kbPerPage,
  340.          vmStat.kernMemPages * kbPerPage, 
  341.          vmStat.kernStackPages * kbPerPage,
  342.          (vmStat.fsMap - vmStat.fsUnmap) * kbPerPage,
  343.          vmStat.totalFaults - prevStat.totalFaults, 
  344.          vmStat.psFilled - prevStat.psFilled,
  345.          vmStat.fsFilled - prevStat.fsFilled,
  346.          vmStat.pagesWritten - prevStat.pagesWritten);
  347.     }
  348.     bcopy((Address)&vmStat, (Address)&prevStat, sizeof(Vm_Stat));
  349.     fflush(stdout);
  350. }
  351.  
  352.  
  353. /*
  354.  *----------------------------------------------------------------------
  355.  *
  356.  * PrintSummary --
  357.  *
  358.  *    Print a verbose summary of all vm statistics.
  359.  *
  360.  * Results:
  361.  *    None.
  362.  *
  363.  * Side effects:
  364.  *    Prints information on standard output.
  365.  *
  366.  *----------------------------------------------------------------------
  367.  */
  368. PrintSummary()
  369. {
  370.     int            actCodePages = 0;
  371.     int            inactCodePages = 0;
  372.     int            actCodeSegs = 0;
  373.     int            inactCodeSegs = 0;
  374.     int            heapPages = 0;
  375.     int            heapSegs = 0;
  376.     int            stackPages = 0;
  377.     int            stackSegs = 0;
  378.     Vm_SegmentInfo    seg;
  379.     int            i;
  380.     Vm_Stat         vmStat;
  381.     int            totPages;
  382.     int            inusePages;
  383.     int            numModifiedPages;
  384.     int            totPercent;
  385.     int            totFaults;
  386.     int            heapPercent;
  387.     int            stkPercent;
  388.     int            quickPercent;    
  389.     int            totHits;
  390.     int            totPrefetches;
  391.     int            hitPct;
  392.     ReturnStatus    status;
  393.  
  394.     Vm_Cmd(VM_GET_STATS, &vmStat);
  395.     Vm_Cmd(VM_COUNT_DIRTY_PAGES, &numModifiedPages);
  396.     for (i = 1; i < NUM_SEGMENTS; i++) {
  397.     status = Vm_GetSegInfo(NULL, i, sizeof(Vm_SegmentInfo), &seg);
  398.     if (status != SUCCESS) {
  399.         (void) fprintf(stderr,
  400.                "Couldn't read segment info for segment %d: %s\n",
  401.                i,  Stat_GetMsg(status));
  402.         return;
  403.     }
  404.     if (seg.flags & VM_SEG_FREE) {
  405.         continue;
  406.     }
  407.     switch (seg.type) {
  408.         case VM_CODE:
  409.             if (seg.flags & VM_SEG_INACTIVE) {
  410.             inactCodePages += seg.resPages;
  411.             inactCodeSegs++;
  412.         } else {
  413.             actCodePages += seg.resPages;
  414.             actCodeSegs++;
  415.         }
  416.         break;
  417.         case VM_HEAP:
  418.         heapPages += seg.resPages;
  419.         heapSegs++;
  420.         break;
  421.         case VM_STACK:
  422.         stackPages += seg.resPages;
  423.         stackSegs++;
  424.         break;
  425.     }
  426.     }
  427.     printf("MEMORY STATS:\n");
  428.     printf("\tPage Size:\t%-8d\n", 1024 * kbPerPage);
  429.     printf("\tMemory Size:\t%-8d\n", vmStat.numPhysPages * kbPerPage);
  430.     printf("\tKernel Memory:\t%-8d (Code+Data=%d Stacks=%d Reserved=%d)\n",
  431.          (vmStat.kernMemPages + vmStat.kernStackPages +
  432.             vmStat.numReservePages) * kbPerPage,
  433.          vmStat.kernMemPages * kbPerPage, 
  434.          vmStat.kernStackPages * kbPerPage,
  435.          vmStat.numReservePages * kbPerPage);
  436.     inusePages = vmStat.numDirtyPages + vmStat.numUserPages;
  437.     printf("\tUser Memory:\t%-8d (Dirty=%d Clean=%d)\n",
  438.         inusePages * kbPerPage, 
  439.         numModifiedPages * kbPerPage, 
  440.         (inusePages - numModifiedPages) * kbPerPage);
  441.     printf("\tFS Memory:\t%-8d (Min=%d Max=%d)\n", 
  442.         (vmStat.fsMap - vmStat.fsUnmap) * kbPerPage, 
  443.         vmStat.minFSPages * kbPerPage,
  444.         vmStat.maxFSPages * kbPerPage);
  445.     printf("\tFree Memory:\t%d\n", vmStat.numFreePages * kbPerPage);
  446.     if (verbose) {
  447.     printf("\tMod page stats:\tPot-mod=%d Not-mod=%d Not-hard-mod=%d\n",
  448.         vmStat.potModPages, vmStat.notModPages, vmStat.notHardModPages);
  449.     }
  450.     printf("SEGMENT STATS:\n");
  451.     printf("\tAct-code:\tNum-segs=%-3d Res-size=%d\n", actCodeSegs,
  452.                           actCodePages * kbPerPage);
  453.     printf("\tInact-code:\tNum-segs=%-3d Res-size=%d\n", inactCodeSegs,
  454.                           inactCodePages * kbPerPage);
  455.     printf("\tHeap:\t\tNum-segs=%-3d Res-size=%d\n", heapSegs, 
  456.                           heapPages * kbPerPage);
  457.     printf("\tStack:\t\tNum-segs=%-3d Res-size=%d\n", stackSegs, 
  458.                           stackPages*kbPerPage);
  459.     printf("FAULT STATS:\n");
  460.     printf("\tTotal:\t\t%d\n", vmStat.totalFaults);
  461.     printf("\tFault-type:\tZero=%-6d FS=%-8d Swap=%-9d Quick=%d\n", 
  462.          vmStat.zeroFilled, vmStat.fsFilled,
  463.          vmStat.psFilled, vmStat.quickFaults -
  464.         (vmStat.numCOWStkFaults + vmStat.numCOWHeapFaults +
  465.          vmStat.numCORStkFaults + vmStat.numCORHeapFaults));
  466.     printf("\t\t\tCOW=%-7d COR=%-7d COR-mod=%-5d\n",
  467.          vmStat.numCOWStkFaults + vmStat.numCOWHeapFaults,
  468.          vmStat.numCORStkFaults + vmStat.numCORHeapFaults,
  469.          vmStat.numCORCOWStkFaults + vmStat.numCORCOWHeapFaults);
  470.     printf("\tSeg-type:\tCode=%-6d Heap=%-6d Stack=%-6d\n", 
  471.          vmStat.codeFaults, vmStat.heapFaults, vmStat.stackFaults);
  472.     printf("\tCollisions:\t%d\n", vmStat.collFaults);
  473.     printf("PAGE-OUTS:\n");
  474.     printf("\tPages written:\t%d\n", vmStat.pagesWritten);
  475.     if (verbose) {
  476.     printf("\tClean Wait:\t%d\n", vmStat.cleanWait);
  477.     printf("\tCleaner starts:\t%d\n", vmStat.pageoutWakeup);
  478.     }
  479.     printf("COPY-ON-WRITE:\n");
  480.     totPages = vmStat.numCOWStkPages + vmStat.numCOWHeapPages;
  481.     totFaults = vmStat.numCOWStkFaults + vmStat.numCOWHeapFaults;
  482.     if (vmStat.numCOWHeapPages > 0) {
  483.     heapPercent = 100.0 * ((float)vmStat.numCOWHeapFaults / 
  484.                       vmStat.numCOWHeapPages);
  485.     } else {
  486.     heapPercent = 0;
  487.     }
  488.     if (vmStat.numCOWStkPages > 0) {
  489.     stkPercent = 100.0 * ((float)vmStat.numCOWStkFaults / 
  490.                       vmStat.numCOWStkPages);
  491.     } else {
  492.     stkPercent = 0;
  493.     }
  494.     if (totPages > 0) {
  495.     totPercent = 100.0 * ((float)totFaults / totPages);
  496.     } else {
  497.     totPercent = 0;
  498.     }
  499.     if (totFaults > 0) {
  500.     quickPercent = 100.0 * ((float)vmStat.quickCOWFaults / totFaults);
  501.     } else {
  502.     quickPercent = 0;
  503.     }
  504.     printf("\tCOW:\t\tHeap (%d/%d)=%d%%\tStack (%d/%d)=%d%%\n",
  505.         vmStat.numCOWHeapFaults, vmStat.numCOWHeapPages, heapPercent,
  506.         vmStat.numCOWStkFaults, vmStat.numCOWStkPages, stkPercent);
  507.     printf("\t\t\tTot  (%d/%d)=%d%%\tQuick (%d/%d)=%d%%\n",
  508.         totFaults, totPages, totPercent,
  509.         vmStat.quickCOWFaults, totFaults, quickPercent);
  510.     /*
  511.      * Copy on reference.
  512.      */
  513.     totPages = vmStat.numCORStkPages + vmStat.numCORHeapPages;
  514.     totFaults = vmStat.numCORStkFaults + vmStat.numCORHeapFaults;
  515.     if (vmStat.numCORHeapPages > 0) {
  516.     heapPercent = 100.0 * ((float)vmStat.numCORHeapFaults / 
  517.                       vmStat.numCORHeapPages);
  518.     } else {
  519.     heapPercent = 0;
  520.     }
  521.     if (vmStat.numCORStkPages > 0) {
  522.     stkPercent = 100.0 * ((float)vmStat.numCORStkFaults / 
  523.                       vmStat.numCORStkPages);
  524.     } else {
  525.     stkPercent = 0;
  526.     }
  527.     if (totPages > 0) {
  528.     totPercent = 100.0 * ((float)totFaults / totPages);
  529.     } else {
  530.     totPercent = 0;
  531.     }
  532.     printf("\tCOR:\t\tHeap (%d/%d)=%d%%\tStack (%d/%d)=%d%%\n",
  533.         vmStat.numCORHeapFaults, vmStat.numCORHeapPages, heapPercent,
  534.         vmStat.numCORStkFaults, vmStat.numCORStkPages, stkPercent,
  535.         totFaults, totPages, totPercent);
  536.     printf("\t\t\tTot  (%d/%d)=%d%%\n",
  537.         totFaults, totPages, totPercent);
  538.     totPages = vmStat.numCORStkFaults + vmStat.numCORHeapFaults;
  539.     totFaults = vmStat.numCORCOWStkFaults + vmStat.numCORCOWHeapFaults;
  540.     if (vmStat.numCORCOWHeapFaults > 0) {
  541.     heapPercent = 100.0 * ((float)vmStat.numCORCOWHeapFaults / 
  542.                       vmStat.numCORHeapFaults);
  543.     } else {
  544.     heapPercent = 0;
  545.     }
  546.     if (vmStat.numCORCOWStkFaults > 0) {
  547.     stkPercent = 100.0 * ((float)vmStat.numCORCOWStkFaults / 
  548.                       vmStat.numCORStkFaults);
  549.     } else {
  550.     stkPercent = 0;
  551.     }
  552.     if (totPages > 0) {
  553.     totPercent = 100.0 * ((float)totFaults / totPages);
  554.     } else {
  555.     totPercent = 0;
  556.     }
  557.     if (vmStat.numCORCOWHeapFaults > 0) {
  558.     printf("\tCOR-mod:\tHeap (%d/%d)=%d%%\tStack (%d/%d)=%d%%\n",
  559.         vmStat.numCORCOWHeapFaults, vmStat.numCORHeapFaults, heapPercent,
  560.         vmStat.numCORCOWStkFaults, vmStat.numCORStkFaults, stkPercent,
  561.         vmStat.numCORCOWHeapFaults + vmStat.numCORCOWStkFaults);
  562.     printf("\t\t\tTot  (%d/%d)=%d%%\n",
  563.         vmStat.numCORCOWHeapFaults + vmStat.numCORCOWStkFaults,
  564.         vmStat.numCORHeapFaults + vmStat.numCORStkFaults, totPercent);
  565.     }
  566.     if (verbose) {
  567.     printf("ALLOCATION STATS:\n");
  568.     printf("\tVm allocs:\t%d\t(Free=%d From-FS=%d From-alloc-list=%d)\n",
  569.          vmStat.numAllocs, vmStat.gotFreePage, vmStat.gotPageFromFS, 
  570.          vmStat.pageAllocs);
  571.     printf("\tVM-FS stats:\tFS-asked=%d Had-free-page=%d\n",
  572.          vmStat.fsAsked, vmStat.haveFreePage);
  573.     printf("\t\t\tFS-map=%d FS-unmap=%d\n", vmStat.fsMap, vmStat.fsUnmap);
  574.     printf("\tList searches:\t%d (Free=%d In-use=%d)\n",
  575.          vmStat.numListSearches, vmStat.usedFreePage, 
  576.          vmStat.numListSearches - vmStat.usedFreePage);
  577.     printf("\tExtra-searches:\t%d (Lock=%d Ref=%d Dirty=%d)\n",
  578.          vmStat.lockSearched + vmStat.refSearched + vmStat.dirtySearched,
  579.          vmStat.lockSearched, vmStat.refSearched, vmStat.dirtySearched);
  580.     printf("LIST STATS:\n");
  581.     printf("\tAlloc-list:\t%d\n", vmStat.numUserPages);
  582.     printf("\tDirty-list:\t%d\n", vmStat.numDirtyPages);
  583.     printf("\tFree-list:\t%d\n", vmStat.numFreePages);
  584.     printf("\tReserve-list:\t%d\n", vmStat.numReservePages);
  585. #ifdef notdef
  586.     totPrefetches = vmStat.codePrefetches + vmStat.heapFSPrefetches +
  587.             vmStat.heapSwapPrefetches + vmStat.stackPrefetches;
  588.     if (totPrefetches > 0) {
  589.         totHits = vmStat.codePrefetchHits + vmStat.heapFSPrefetchHits +
  590.               vmStat.heapSwapPrefetchHits + vmStat.stackPrefetchHits;
  591.         printf("Prefetch stats:\n");
  592.         if (vmStat.codePrefetches > 0) {
  593.         hitPct = 100 * ((float)vmStat.codePrefetchHits / 
  594.                 (float)vmStat.codePrefetches);
  595.         printf("    code (%d/%d)=%d%%\n",
  596.             vmStat.codePrefetchHits, vmStat.codePrefetches, hitPct);
  597.         }
  598.         if (vmStat.heapFSPrefetches > 0) {
  599.         hitPct = 100 * ((float)vmStat.heapFSPrefetchHits / 
  600.                 (float)vmStat.heapFSPrefetches);
  601.         printf("    heap-fs (%d/%d)=%d%%\n",
  602.             vmStat.heapFSPrefetchHits, vmStat.heapFSPrefetches, hitPct);
  603.         }
  604.         if (vmStat.heapSwapPrefetches > 0) {
  605.         hitPct = 100 * ((float)vmStat.heapSwapPrefetchHits / 
  606.                 (float)vmStat.heapSwapPrefetches);
  607.         printf("    heap-swp (%d/%d)=%d%%\n",
  608.             vmStat.heapSwapPrefetchHits, vmStat.heapSwapPrefetches, 
  609.             hitPct);
  610.         }
  611.         if (vmStat.stackPrefetches > 0) {
  612.         hitPct = 100 * ((float)vmStat.stackPrefetchHits / 
  613.                 (float)vmStat.stackPrefetches);
  614.         printf("    stack (%d/%d)=%d%%\n",
  615.             vmStat.stackPrefetchHits, vmStat.stackPrefetches, hitPct);
  616.         }
  617.         hitPct = 100 * ((float)totHits / (float)totPrefetches);
  618.         printf("    total (%d/%d)=%d%%\n",
  619.             totHits, totPrefetches, hitPct);
  620.         printf("    aborts=   %d\n", vmStat.prefetchAborts);
  621.     }
  622. #endif
  623.     printf("PAGE MAPPING STATS:\n");
  624.     printf("\tMap page wait:\t%d\n", vmStat.mapPageWait);
  625. #ifdef sun2
  626.     printf("HARDWARE_STATS:\n");
  627.     printf("\tCtxts stolen:\t%d\n", vmStat.machDepStat.stealContext);
  628.     printf("\tPmegs stolen:\t%d\n", vmStat.machDepStat.stealPmeg);
  629. #endif
  630. #ifdef sun3
  631.     printf("HARDWARE_STATS:\n");
  632.     printf("\tCtxts stolen:\t%d\n", vmStat.machDepStat.stealContext);
  633.     printf("\tPmegs stolen:\t%d\n", vmStat.machDepStat.stealPmeg);
  634. #endif
  635. #ifdef sun4
  636.     printf("HARDWARE_STATS:\n");
  637.     printf("\tCtxts stolen:\t%d\n", vmStat.machDepStat.stealContext);
  638.     printf("\tPmegs stolen:\t%d\n", vmStat.machDepStat.stealPmeg);
  639. #endif
  640. #ifdef spur
  641.     printf("HARDWARE_STATS:\n");
  642.     printf("\tRef bit faults:\t%d\n", vmStat.machDepStat.refBitFaults);
  643.     printf("\tDirty bit faults:\t%d\n", vmStat.machDepStat.dirtyBitFaults);
  644. #endif
  645. #ifdef ds3100
  646.     printf("HARDWARE_STATS:\n");
  647. #ifdef notdef 
  648.     /* 
  649.      * Not currently implemented by kernel.
  650.      */
  651.     printf("\tTlb entries stolen:\t%d\n", vmStat.machDepStat.stealTLB);
  652. #endif
  653.     printf("\tPids stolen:\t%d\n", vmStat.machDepStat.stealPID);
  654. #endif
  655.     }
  656. }
  657.  
  658. @
  659.  
  660.  
  661. 1.7
  662. log
  663. @Was returning non-zero status.
  664. @
  665. text
  666. @d11 1
  667. a11 1
  668. static char rcsid[] = "$Header: /sprite/src/cmds/vmstat/RCS/vmstat.c,v 1.6 89/07/31 18:51:27 mendel Exp Locker: ouster $ SPRITE (Berkeley)";
  669. d586 10
  670. @
  671.  
  672.  
  673. 1.6
  674. log
  675. @Fixed to use lower case ifdefs.  Added support for sun4. Changed to use
  676. sleep rather than Sync_WaitTIme.
  677. @
  678. text
  679. @d11 1
  680. a11 1
  681. static char rcsid[] = "$Header: /a/newcmds/vmstat/RCS/vmstat.c,v 1.5 89/02/22 11:37:49 jhh Exp $ SPRITE (Berkeley)";
  682. d115 1
  683. @
  684.  
  685.  
  686. 1.5
  687. log
  688. @Now uses new Proc_GetPCBInfo and Vm_GetSegInfo interfaces
  689. @
  690. text
  691. @d11 1
  692. a11 1
  693. static char rcsid[] = "$Header: /a/newcmds/vmstat/RCS/vmstat.c,v 1.4 88/09/26 12:00:17 nelson Exp Locker: jhh $ SPRITE (Berkeley)";
  694. a109 4
  695.     struct timeval    waitTime;
  696.  
  697.     waitTime.tv_sec = checkTime;
  698.     waitTime.tv_usec = 0;
  699. d112 1
  700. a112 1
  701.         Sync_WaitTime(waitTime);
  702. d566 6
  703. a571 1
  704. #ifdef SUN2
  705. d576 1
  706. a576 1
  707. #ifdef SUN3
  708. d581 1
  709. a581 1
  710. #ifdef SPUR
  711. @
  712.  
  713.  
  714. 1.4
  715. log
  716. @Added spur dependent stats.
  717. @
  718. text
  719. @d11 1
  720. a11 1
  721. static char rcsid[] = "$Header: vmstat.c,v 1.3 88/08/15 15:53:19 nelson Exp $ SPRITE (Berkeley)";
  722. d15 1
  723. a15 1
  724. #include <kernel/vmStat.h>
  725. d147 1
  726. a147 1
  727.     Vm_Segment        seg;
  728. d151 1
  729. d157 7
  730. a163 1
  731.     Vm_GetSegInfo(NULL, i, &seg);
  732. d323 1
  733. a323 1
  734.     Vm_Segment        seg;
  735. d337 1
  736. d342 7
  737. a348 1
  738.     Vm_GetSegInfo(NULL, i, &seg);
  739. @
  740.  
  741.  
  742. 1.3
  743. log
  744. @Got rid of extraneous stats.
  745. @
  746. text
  747. @d11 1
  748. a11 1
  749. static char rcsid[] = "$Header: vmstat.c,v 1.2 88/08/12 19:22:25 nelson Exp $ SPRITE (Berkeley)";
  750. d565 5
  751. @
  752.  
  753.  
  754. 1.2
  755. log
  756. @Fixed alignment problem with printing segment info.
  757. @
  758. text
  759. @d11 1
  760. a11 1
  761. static char rcsid[] = "$Header: vmStat.c,v 1.14 88/01/10 16:54:54 nelson Exp $ SPRITE (Berkeley)";
  762. d189 1
  763. a189 1
  764.     printf("\n%-20s%-15s%-15s\n\n", "SEG_TYPE", "NUM-SEGS", "RES-SIZE");
  765. a332 2
  766.     /*
  767.      * Gather
  768. d392 1
  769. a392 1
  770.     printf("\tFault-type:\tZero=%-6d FS=%-8d Swap=%-6d Quk=%-6d Co=%d\n", 
  771. d394 7
  772. a400 1
  773.          vmStat.psFilled,vmStat.quickFaults, vmStat.collFaults);
  774. d403 1
  775. d408 1
  776. a408 3
  777.     printf("\tPage cleaners:\tAwake=%d No-work=%d Wait=%d\n",
  778.             vmStat.pageoutWakeup, vmStat.pageoutNoWork,
  779.             vmStat.pageoutWait);
  780. d556 1
  781. d560 6
  782. @
  783.  
  784.  
  785. 1.1
  786. log
  787. @Initial revision
  788. @
  789. text
  790. @d153 1
  791. a153 1
  792.         "    SIZE", "RES-SIZE", "NUM-REFS", "OBJECT-FILE-NAME");
  793. @
  794.